//引入本地存储token的方法
import { getToken, setToken, removeToken, setTimeStamp } from '@/utils/auth'
import { login, getUserInfo, getUserDetailById } from '@/api/user'
import { resetRouter } from '@/router'
const state = {
  //一开始从本地读取token
  token: getToken(),
  //设置userInfo
  userInfo: {}   //这里必须是个空对象不能是null因为null.name会报错
}
//修改state
const mutations = {
  //修改token
  setToken (state, token) {
    //修改vuex里面的token
    state.token = token
    //修改本地存储的token
    setToken(token)
  },
  //删除token
  removeToken () {
    //删除vuex的token
    state.token = null
    //清除本地的token
    removeToken()
  },
  //修改userInfo
  setUserInfo (state, data) {
    state.userInfo = { ...data }   //浅拷贝响应式
  },
  //删除userInfo
  removeUserInfo (state) {
    state.userInfo = {}
  }
}
const actions = {
  //登录获取token
  async login (context, data) {
    const res = await login(data)
    // console.log(res)
    context.commit('setToken', res)
    // 写入时间戳
    setTimeStamp() // 将当前的最新时间写入缓存
  },
  //获取用户信息
  async getUserInfo (context) {
    const res = await getUserInfo()
    //获取用户基本信息
    const res2 = await getUserDetailById(res.userId)
    context.commit('setUserInfo', { ...res, ...res2 })
    return res  //埋伏笔  做权限拦截的时候用
  },
  //登出功能
  logout (context) {
    // 删除token
    context.commit('removeToken') // 不仅仅删除了vuex中的 还删除了缓存中的
    // 删除用户资料
    context.commit('removeUserInfo') // 删除用户信息
    //重置路由
    resetRouter()
    //重置路由表
    //vuex里面子模块怎么调用子模块的方法
    context('permission/setRoutes', [], { root: true })
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

